Snapshots are used to record and preserve the state of a volume of data at any given moment. There are many scenarios where a consumer application (e.g., a backup or replication application) takes a volume snapshot to create a consistent, point-in-time image of the stored information, in order to read blocks of data without interfering with another application (e.g., a database application) that is also making use of that information. These snapshots are, most of the time, solely for the purpose of the consumer application. The duration of the backup/replication task is also the lifetime of the snapshot. Depending upon the amount of data to be processed from the snapshot, this lifetime can be quite long, especially if the backup/replication application requires persisting the snapshot during the processing.
For the lifetime of the snapshot, there will be a copy-on-write overhead associated with every first write to a block in the volume of data, even for those blocks that have already been read by the consumer application. That is, even though a block in the volume has already been read by the consumer application and a point-in-time image of the data in that block is no longer needed for that purpose, the data in the block will still be copied from the volume to the snapshot if data is to be written to that block, unnecessarily incurring a copy-on-write overhead.